a76b8f
@@ -22,14 +22,25 @@
 
 package org.jboss.as.clustering.infinispan.subsystem;
 
+import java.util.ServiceLoader;
+import java.util.stream.StreamSupport;
+
 import org.infinispan.configuration.cache.PersistenceConfiguration;
 import org.infinispan.persistence.jdbc.configuration.JdbcStringBasedStoreConfiguration;
 import org.infinispan.persistence.jdbc.configuration.JdbcStringBasedStoreConfigurationBuilder;
 import org.infinispan.persistence.jdbc.configuration.TableManipulationConfiguration;
+import org.infinispan.persistence.keymappers.TwoWayKey2StringMapper;
+import org.jboss.as.controller.OperationContext;
+import org.jboss.as.controller.OperationFailedException;
 import org.jboss.as.controller.PathAddress;
+import org.jboss.dmr.ModelNode;
+import org.jboss.modules.Module;
 import org.jboss.msc.service.ServiceBuilder;
 import org.jboss.msc.service.ServiceTarget;
 import org.jboss.msc.value.InjectedValue;
+import org.wildfly.clustering.service.Builder;
+import org.wildfly.clustering.service.InjectedValueDependency;
+import org.wildfly.clustering.service.ValueDependency;
 
 /**
  * @author Paul Ferraro
@@ -39,6 +50,8 @@
public class StringKeyedJDBCStoreBuilder extends JDBCStoreBuilder<JdbcStringBase
     private final InjectedValue<TableManipulationConfiguration> table = new InjectedValue<>();
     private final PathAddress cacheAddress;
 
+    private volatile ValueDependency<Module> module;
+
     StringKeyedJDBCStoreBuilder(PathAddress cacheAddress) {
         super(JdbcStringBasedStoreConfigurationBuilder.class, cacheAddress);
         this.cacheAddress = cacheAddress;
@@ -46,12 +59,22 @@
public class StringKeyedJDBCStoreBuilder extends JDBCStoreBuilder<JdbcStringBase
 
     @Override
     public ServiceBuilder<PersistenceConfiguration> build(ServiceTarget target) {
-        return super.build(target).addDependency(CacheComponent.STRING_TABLE.getServiceName(this.cacheAddress), TableManipulationConfiguration.class, this.table);
+        return this.module.register(super.build(target))
+                .addDependency(CacheComponent.STRING_TABLE.getServiceName(this.cacheAddress), TableManipulationConfiguration.class, this.table)
+                ;
+    }
+
+    @Override
+    public Builder<PersistenceConfiguration> configure(OperationContext context, ModelNode model) throws OperationFailedException {
+        this.module = new InjectedValueDependency<>(CacheContainerComponent.MODULE.getServiceName(context.getCurrentAddress().getParent().getParent()), Module.class);
+        return super.configure(context, model);
     }
 
     @Override
     public void accept(JdbcStringBasedStoreConfigurationBuilder builder) {
         builder.table().read(this.table.getValue());
+        StreamSupport.stream(ServiceLoader.load(TwoWayKey2StringMapper.class, this.module.getValue().getClassLoader()).spliterator(), false).findFirst()
+                .ifPresent(impl -> builder.key2StringMapper(impl.getClass()));
         super.accept(builder);
     }
 }
